﻿<?php
require_once('Playlist.php');

/*
* PlaylistManager.
*
* Gestor del sistema para las playlists.
*/
class PlaylistManager {

	private $system = null;

	public function __construct(&$system) {
		$this->system = $system;
	}
	
	/*
	 * Devuelve la lista de playlists creadas por el usuario
	 * @return Playlist null si no se ha podido obtener.
	 */
	public function getMyPlaylists() {
		// Si no hay ninguna sesión iniciada no se devuelve nada
		if (!$this->system->userManager->logged())
			return null;
			
		return $this->system->database->playlistDatabase->getAllPlaylistsFromUser($_SESSION['id']);
	}
	
	/*
	 * Devuelve la lista de playlists favoritas del usuario
	 * @return Playlist null si no se ha podido obtener.
	 */
	public function getMyFavorites() {
		// Si no hay ninguna sesión iniciada no se devuelve nada
		if (!$this->system->userManager->logged())
			return null;
			
		return $this->system->database->playlistDatabase->getMyFavorites($_SESSION['id']);
	}
	
	/*
	 * Devuelve la informacion de una playlist concreta
	 * @param Int id de la playlist
	 * @return Playlist null si no se ha podido obtener.
	 */
	public function getPlaylist($playlistId) {
		// Se consigue la información de la playlist incluidas las canciones
		$playlist = $this->system->database->playlistDatabase->getPlaylistById($playlistId);
		if ($playlist != null)
			$playlist->songs = $this->system->database->songDatabase->getAllSongsFromPlaylist($playlistId);
		
		return $playlist;
	}
	
	/*
	 * Crea una playlist insertandola en la base de datos
	 * @param Playlist La playlist con toda la informacion lista para ser insertada.
	 */
	public function createPlaylist($playlist) {
		if (!$this->system->userManager->logged())
			return;
		
		/* Se inserta antes la playlist y después las canciones una a una comprobando que
			no haya repeticiones. */
		$iSong = 1;
		$this->system->database->playlistDatabase->insertNewPlaylist($_SESSION['id'], $playlist);
		foreach($playlist->songs as $song) {
			$dbSong = $this->system->database->songDatabase->getSongByLink($song->link);
			if ($dbSong == null)
				$this->system->database->songDatabase->insertNewSongToPlayList($playlist->id, $song, $iSong);
			else
				$this->system->database->songDatabase->insertSongToPlayList($playlist->id, $dbSong, $iSong);
			$iSong++;
		}
	}
	
	/*
	 * Elimina una playlist del sistema
	 * @param Int id de la playlist a eliminar
	 */
	public function deletePlaylist($playlistId) {
		$playlist = $this->system->database->playlistDatabase->getPlaylistById($playlistId);
		$songs = $this->system->database->songDatabase->getAllSongsFromPlaylist($playlistId);
		
		/* Primero se borran todas las canciones (las relaciones canción - playlist y la canción si es necesario)
			y luego se borra la propia playlist. */
		foreach ($songs as $song) {
			$this->system->database->songDatabase->removeSong($playlistId, $song->id);
		}
		$this->system->database->playlistDatabase->removePlaylist($_SESSION['id'], $playlistId);
	}
	
	/*
	 * Modifica el contenido de una playlist
	 * @param Playlist La playlist con la informacion modificada (ha de tener el mismo id)
	 */
	public function editPlaylist($newPlaylist) {
		$this->deletePlaylist($newPlaylist->id);
		$this->createPlaylist($newPlaylist);
	}
	
	/*
	 * Devuelve las playlists creadas por el usuario en formato JSON
	 * @return String Informacion de las playlists en formato JSON
	 */
	public function getMyPlaylistsJSON() {
		return $this->getPlaylistsJSON($this->getMyPlaylists());
	}

	/*
	 * Devuelve las playlists favoritas del usuario en formato JSON
	 * @return String Informacion de las playlists en formato JSON
	 */
	public function getMyFavoritesJSON() {
		return $this->getPlaylistsJSON($this->getMyFavorites());
	}
	
	/*
	 * Devuelve las playlists pasadas como parametros en formato JSON
	 * @param Playlist Lista de playlist con formato de objeto JS
	 * @return String Informacion de las playlists en formato JSON
	 */
	private function getPlaylistsJSON($playlists) {
		$json = '{"playlists" : [';
		if ($playlists != null) {
			$last_playlist = end($playlists);
			foreach($playlists as $playlist) {
				$json .= '{"id" : ' . $playlist->id . ', ';
				$json .= '"name" : "' . $playlist->name . '"}';
				if ($playlist != $last_playlist)
					$json .= ', ';
			}
		}
		$json .= ']}';
		
		return $json;
	}
	
	/*
	 * Inserta un voto positivo para una playlist
	 * @param integer $userId
	 * @param integer $playlistId
	 * @return integer El número de votos positivos resultante.
	 */
	public function positiveVote($userId,$playlistId) {
		$this->system->database->playlistDatabase->insertVoteRelation($userId,$playlistId);
		return $this->system->database->playlistDatabase->increasePositiveVotes($playlistId);
	}
	
	/*
	 * Inserta un voto negativo para una playlist
	 * @param integer $userId
	 * @param integer $playlistId
	 * @return integer El número de votos negativos resultante.
	 */
	public function negativeVote($userId,$playlistId) {
		$this->system->database->playlistDatabase->insertVoteRelation($userId,$playlistId);
		return $this->system->database->playlistDatabase->increaseNegativeVotes($playlistId);
	}
	
	/*
	 * Comprueba si un usuario puede votar a una playlist.
	 * @param integer $userId
	 * @param integer $playlistId
	 * @return boolean Cierto si el usuario no ha votado esa playlist antes.
	 */
	public function canVote($userId,$playlistId) {
		return $this->system->database->playlistDatabase->canVote($userId,$playlistId);
	}
	
	/*
	 * Comprueba si una playlist es favorita de un usuario
	 * @param integer $userId
	 * @param integer $playlistId
	 * @return boolean.
	*/
	public function isFavorite($userId, $playlistId) {
		return $this->system->database->playlistDatabase->isFavorite($userId, $playlistId);
	}
}
?>